package com.jumper.property.comparer.core.support;


import com.jumper.property.comparer.core.enums.LogTable;
import com.jumper.property.comparer.core.result.User;
import com.jumper.property.comparer.core.support.param.LogPageParam;
import com.jumper.property.comparer.core.support.param.Vars;
import com.jumper.property.comparer.core.support.result.LogEntityPage;

import java.util.Collection;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * 操作日志管理器
 *
 * @param <T> 查询监听数据主键类型
 */
public interface LogManager<T> {

    /**
     * 获取操作类型
     */
    LogTable getBusType();

    /**
     * 操作日志
     */
    @Deprecated
    void logAction(T optDataKey, String optName, User user);

    /**
     * 操作日志
     */
    void logAction(T optDataKey, String optName, String logValue, User user);

    /**
     * 操作日志, 支持语法 {{变量名}}
     */
    void logAction(T optDataKey, String optName, String logValueTemplate, Vars vars, User user);

    /**
     * 操作日志, 同步执行, 可能会抛出异常
     */
    void logActionDirect(T optDataKey, String optName, String logValue, User user);

    /**
     * 操作日志, 支持语法 {{变量名}}同步执行, 可能会抛出异常
     */
    void logActionDirect(T optDataKey, String optName, String logValueTemplate, Vars vars, User user);

    /**
     * 操作日志 批量
     */
    void logAction(Collection<T> optDataKeys, String optName, String logValue, User user);

    /**
     * 操作日志, 支持语法 {{变量名}}  批量
     */
    void logAction(Collection<T> optDataKeys, String optName, String logValueTemplate, Vars vars, User user);

    /**
     * 提交一个事件变更, 返回值
     */
    @Deprecated
    <V> V submit(T optDataKey, String optName, Class<?> cls, User user, Callback<V> callable);

    /**
     * 提交一个事件变更, 无返回值
     */
    @Deprecated
    void execute(T optDataKey, String optName, Class<?> cls, User user, Runnable runnable);

    /**
     * 分页查询日志
     */
    LogEntityPage getLogPage(LogPageParam param);

    /**
     * 提交一个事件变更, 返回值
     */
    <V> V submit(T optDataKey, String optName, Class<?> cls, User user, Function<InTransactionQuery, V> transactionFunc);

    /**
     * 提交一个事件变更, 无返回值
     */
    void execute(T optDataKey, String optName, Class<?> cls, User user, Consumer<InTransactionQuery> transactionFunc);
}
